"""
2.	图像金字塔是OpenCV中的重要概念，通常把同一图像的不同分辨率子图的集合叫做图像金字塔，在概念上分为高斯金字塔和拉普拉斯金字塔。
依据下面要求完成代码。（35分）
"""
import cv2 as cv
import numpy as np

# ①	读取leena.jpg图像文件，并进行必要的处理
path = 'data/leena.jpg'
src = cv.imread(path, cv.IMREAD_COLOR)
H, W, CH = src.shape
print(H, W, CH)
if H > W:
    padding = H - W
    img = np.concatenate([src, np.zeros([H, padding, CH], dtype=np.uint8)], axis=1)
else:
    padding = W - H
    img = np.concatenate([src, np.zeros([padding, W, CH], dtype=np.uint8)], axis=0)
img = cv.resize(img, (512, 512), interpolation=cv.INTER_CUBIC)

# ②	对图像进行高斯金字塔处理
N_LEVEL = 3
gauPyr = [img]
tmp = img
for level in range(N_LEVEL):
    down = cv.pyrDown(tmp)
    gauPyr.append(down)
    tmp = down

# ③	对图像进行拉普拉斯金字塔处理
lapPyr = []
for level in range(N_LEVEL):
    up = cv.pyrUp(gauPyr[level + 1])
    lap = cv.subtract(gauPyr[level], up)
    lapPyr.append(lap)

# ④	显示高斯金字塔图像
for i, gau in enumerate(gauPyr):
    cv.imshow(f'Gau#{i}', gau)

# ⑤	显示拉普拉斯金字塔图像
for i, lap in enumerate(lapPyr):
    cv.imshow(f'Lap#{i}', lap)

# Finally
cv.waitKey(0)
cv.destroyAllWindows()
